package cn.itcast.task.pojo;

import lombok.Data;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

/**
 * @author 虎哥
 */
@Data
public class DelayTask<T> implements Delayed {
    /**
     * 任务包含的数据
     */
    private T data;
    /**
     * 延迟任务的执行时间
     */
    private Long deadLine;

    public DelayTask(Long delayTime, T data){
        this.deadLine = System.currentTimeMillis() + delayTime;
        this.data = data;
    }

    /**
     * 获取当前任务的剩余时间
     * @param unit 时间单位
     * @return 以指定的时间单位返回剩余时间
     */
    public long getDelay(TimeUnit unit) {
        long remainTime = deadLine - System.currentTimeMillis();
        return unit.convert(remainTime, TimeUnit.MILLISECONDS);
    }

    /**
     * 比较当前任务与指定任务谁的剩余时间更少
     * @param o 要比较的任务
     * @return 正数：当前任务>指定任务   负数：当前任务<指定任务  0 ：两者相等
     */
    public int compareTo(Delayed o) {
        long l = this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS);
        return l == 0 ? 0: (l > 0 ? 1 : -1);
    }
}
